//package com.sbtr.util;
//
//import java.io.File;
//import java.io.FileInputStream;
//import java.io.FileOutputStream;
//import java.io.IOException;
//import java.io.InputStream;
//import java.nio.charset.Charset;
//import java.text.SimpleDateFormat;
//import java.util.Date;
//import java.util.Locale;
//import java.util.TimeZone;
//
//import javax.annotation.PostConstruct;
//
//import org.apache.commons.lang3.StringUtils;
//import org.apache.http.client.methods.HttpPut;
//import org.apache.http.entity.mime.MultipartEntityBuilder;
//import org.apache.http.impl.client.CloseableHttpClient;
//import org.apache.http.impl.client.HttpClients;
//import org.slf4j.Logger;
//import org.slf4j.LoggerFactory;
//import org.springframework.beans.factory.annotation.Value;
//import org.springframework.http.HttpEntity;
//import org.springframework.http.HttpHeaders;
//import org.springframework.http.MediaType;
//import org.springframework.stereotype.Component;
//import org.springframework.util.Assert;
//import org.springframework.web.client.RestTemplate;
//import org.springframework.web.multipart.MultipartFile;
//
//import com.alibaba.fastjson.JSONArray;
//import com.alibaba.fastjson.JSONObject;
//import com.meicloud.oss.common.auth.AppCredentialsProvider.ACL;
//import com.meicloud.oss.common.constants.AccessControl;
//import com.meicloud.oss.common.trans.model.internal.Bucket;
//import com.meicloud.oss.common.trans.model.request.BucketCreateRequest;
//import com.meicloud.oss.common.trans.model.request.ObjectPreSignedUrlRequest;
//import com.meicloud.oss.sdk.OSS;
//import com.meicloud.oss.sdk.OSSClient;
//
//@Component
//public class OSSUtil {
//
//	public static final Logger logger = LoggerFactory.getLogger(OSSUtil.class);
//
//	@Value("${oss.config.appDomain}")
//	private String appDomain;
//	@Value("${oss.config.authDomain}")
//	private String authDomain;
//
//	@Value("${oss.config.appId}")
//	private String appId;
//
//	@Value("${oss.config.appKey}")
//	private String appKey;
//
//	@Value("${oss.config.bucket}")
//	private String bucket;
//
//	@Value("${oss.config.regionId}")
//	private String regionId;
//
//	@Value("${oss.config.downloadPath}")
//	private String downloadPath;
//
//	private OSS ossClient;
//
//	@PostConstruct
//	public void initOSSClient() {
//		Assert.isTrue(StringUtils.isNotBlank(appDomain), "应用管理系统不能为空");
//		Assert.isTrue(StringUtils.isNotBlank(authDomain), "鉴权系统不能为空");
//		Assert.isTrue(StringUtils.isNotBlank(appId), "应用ID不能为空");
//		Assert.isTrue(StringUtils.isNotBlank(appKey), "应用密钥不能为空");
//		ossClient = new OSSClient(authDomain, appDomain, appId, appKey, ACL.READ_AND_WRITE, Integer.MAX_VALUE);
//	}
//
//	/**
//	 * 创建存储空间
//	 *
//	 * @param bucketname 存储空间名称
//	 * @return
//	 */
//	public Bucket createBucket(String bucketname) {
//		Assert.isTrue(ossClient != null, "oss客户端未初始化");
//		try {
//			BucketCreateRequest bucketCreateRequest = new BucketCreateRequest(bucketname, regionId,
//					AccessControl.PUBLIC_READ_WRITE);
//			return ossClient.createBucket(bucketCreateRequest);
//		} catch (Exception e) {
//			logger.error("创建bucket异常", e);
//		}
//		return null;
//	}
//
//	/**
//	 * 查询存储空间信息
//	 *
//	 * @param bucketName 存储空间名字
//	 * @return
//	 */
//	public Bucket getBucketInfo(String bucketName) {
//		Assert.isTrue(ossClient != null, "oss客户端未初始化");
//		try {
//			return ossClient.getBucketInfo(bucketName);
//		} catch (Exception e) {
//			logger.error("查询bucket信息异常", e);
//		}
//		return null;
//	}
//
//	/**
//	 * 保存文件到对象存储
//	 *
//	 * @param file
//	 */
//	public String putObject(String filename, File file) {
//		Assert.isTrue(ossClient != null, "oss客户端未初始化");
//		if (StringUtils.isBlank(filename)) {
//			logger.error("文件名不能为空");
//			return null;
//		}
//		try (InputStream in = new FileInputStream(file)) {
//			return ossClient.putObject(bucket, filename, in);
//		} catch (Exception e) {
//			logger.error("提交文件到对象存储异常", e);
//		}
//		return null;
//
//	}
//
//	/**
//	 * 保存文件到对象存储
//	 *
//	 * @param file
//	 */
//	public String putObject(String filename, MultipartFile file) {
//		Assert.isTrue(ossClient != null, "oss客户端未初始化");
//
//		if (StringUtils.isBlank(filename)) {
//			logger.error("文件名不能为空");
//			return null;
//		}
//		try (InputStream in = file.getInputStream()) {
//			return ossClient.putObject(bucket, filename, in);
//		} catch (Exception e) {
//			logger.error("提交文件到对象存储异常", e);
//		}
//		return null;
//
//	}
//
//	/**
//	 * 查询对象的路径
//	 *
//	 * @param bucketName 存储空间名称
//	 * @param objectName 对象名称
//	 * @return
//	 */
//	public String getObjectUrl(String objectName) {
//		Assert.isTrue(ossClient != null, "oss客户端未初始化");
//		if (StringUtils.isBlank(objectName)) {
//			logger.error("对象名不能为空");
//			return null;
//		}
//		String url = null;
//		try {
//			int readCountLeft = 5;
//			do {
//				ObjectPreSignedUrlRequest req = new ObjectPreSignedUrlRequest(bucket, objectName,
//						AccessControl.PRIVATE);
//				url = ossClient.getObjectPreSignedUrl(req);
//				readCountLeft -= 1;
//			} while (!checkUrlQualified(url) && readCountLeft != 0);
//			if (readCountLeft == 0) {
//				logger.error("重复5次后仍然拿不到有效地址");
//				return null;
//			}
//			return url;
//		} catch (Exception e) {
//			logger.error("查询对象url异常", e);
//		}
//		return null;
//	}
//
//	/**
//	 * 查看url中的certification=后的值是否存在
//	 */
//	public boolean checkUrlQualified(String url) {
//		Assert.isTrue(ossClient != null, "oss客户端未初始化");
//
//		if (url == null || url.isEmpty()) {
//			return false;
//		}
//		String cert = "certification=";
//		int certificationIndex = url.lastIndexOf(cert);
//		if (certificationIndex <= 0) {
//			return false;
//		}
//		return certificationIndex != url.length() - cert.length();
//	}
//
//	/**
//	 * 下载文件
//	 *
//	 */
//	public File downloadFile(String objectName) {
//		return this.downloadFile(downloadPath, objectName);
//	}
//
//	public File downloadFile(String path, String objectName) {
//		Assert.isTrue(ossClient != null, "oss客户端未初始化");
//		if (StringUtils.isBlank(objectName)) {
//			logger.error("对象名不能为空");
//			return null;
//		}
//		InputStream in = ossClient.getObject(bucket, objectName);
//		File file = new File(path, objectName);
//		file.deleteOnExit();
//		try (FileOutputStream fout = new FileOutputStream(file)) {
//			int index;
//			byte[] bytes = new byte[1024];
//			while ((index = in.read(bytes)) != -1) {
//				fout.write(bytes, 0, index);
//				fout.flush();
//			}
//			in.close();
//			return file;
//		} catch (IOException e) {
//			logger.error("downloadFile error :{}", e.getMessage());
//			return null;
//		}
//	}
//
//	// 删除
//	public boolean deleteObject(String objectName) {
//		Assert.isTrue(ossClient != null, "oss客户端未初始化");
//		Assert.isTrue(StringUtils.isNotBlank(objectName), "对象名不能为空");
//		try {
//			ossClient.deleteObject(bucket, objectName);
//			return true;
//		} catch (Exception e) {
//			logger.error("deleteObject error :{}", e.getMessage());
//			return false;
//		}
//	}
//
//	// 分片上传 初始化
//	public JSONObject init(String fileName, String cert) {
//		String url = appDomain + "/v1/appmanager/multiupload/init";
//		HttpHeaders headers = new HttpHeaders();
//		JSONObject postParams = new JSONObject();
//		postParams.put("appid", appId);
//		postParams.put("bucket", bucket);
//		postParams.put("object", fileName);
//		postParams.put("certification", cert);
//		headers.setContentType(MediaType.APPLICATION_JSON);
//		HttpEntity<JSONObject> r = new HttpEntity<>(postParams, headers);
//		RestTemplate template = new RestTemplate();
//		return template.postForObject(url, r, JSONObject.class);
//	}
//
//	// 获取分片列表
//	public JSONObject list(File file, String cert, String uploadid) {
//		String url = appDomain + "/v1/appmanager/multiupload/list";
//		HttpHeaders headers = new HttpHeaders();
//		JSONObject postParams = new JSONObject();
//		postParams.put("appid", appId);
//		postParams.put("bucket", bucket);
//		postParams.put("object", file.getName());
//		postParams.put("certification", cert);
//		postParams.put("uploadid", uploadid);
//		headers.setContentType(MediaType.APPLICATION_JSON);
//		HttpEntity<JSONObject> r = new HttpEntity<>(postParams, headers);
//		RestTemplate template = new RestTemplate();
//		return template.postForObject(url, r, JSONObject.class);
//	}
//
//	// 完成分片上传
//	public JSONObject complete(File file, String cert, String uploadid, JSONArray object) {
//		String url = appDomain + "/v1/appmanager/multiupload/complete";
//		HttpHeaders headers = new HttpHeaders();
//		JSONObject postParams = new JSONObject();
//		postParams.put("appid", appId);
//		postParams.put("bucket", bucket);
//		postParams.put("object", file.getName());
//		postParams.put("certification", cert);
//		postParams.put("uploadid", uploadid);
//		postParams.put("parts", object);
//		headers.setContentType(MediaType.APPLICATION_JSON);
//		HttpEntity<JSONObject> r = new HttpEntity<>(postParams, headers);
//		RestTemplate template = new RestTemplate();
//		return template.postForObject(url, r, JSONObject.class);
//	}
//
//	// 上传分片
//	@SuppressWarnings("deprecation")
//	public JSONObject uploadFilePart(File file, String cert, int partNumber, String uploadId) {
//		String url = appDomain + "/v1/oss/object/uploadpart" + "/" + appId + "/" + bucket
//				+ "/" + "AICloud.zip" + "?partNumber=" + partNumber + "&uploadId=" + uploadId;
//		HttpPut httpPut = new HttpPut(url);
//		TimeZone.setDefault(TimeZone.getTimeZone("GMT"));
//		Date time = new Date();
//		SimpleDateFormat sdf = new SimpleDateFormat("E", Locale.ENGLISH);
//		String week = sdf.format(time);
//		httpPut.addHeader("x-amz-date", week + "," + time.toGMTString());
//		httpPut.addHeader("x-amz-acl", "public-read-write");
//		httpPut.addHeader("Certification", cert);
//		MultipartEntityBuilder multipartEntityBuilder = MultipartEntityBuilder.create()
//				.setCharset(Charset.forName("UTF-8"));
//		multipartEntityBuilder.addBinaryBody("data", file);
//		org.apache.http.HttpEntity entiy = multipartEntityBuilder.build();
//		httpPut.setEntity(entiy);
//		try (CloseableHttpClient closeableHttpClient = HttpClients.createDefault()) {
//			closeableHttpClient.execute(httpPut);
//		} catch (Exception e) {
//			logger.error("uploadFilePart error :{}", e.getMessage());
//		}
//		return null;
//	}
//
//}